const YBTool = require('@/lib/tool/YBTool')
const AdminMongo = require('@mongodb/admin/index')
const ErrorCode = require('@/lib/error/code')
const { getToken } = require('@/lib/jsonwebtoken')
const BaseServer = require("../base/baseServer")
const WRedise = require("@/lib/redis/index")
const { getData } = require('@/lib/jsonwebtoken')
const { decryption } = require('@/lib/rsa')

/**
 * Redise 里面存token的header
 */
const REDISE_TOKEN_HEADRT_KEY = process.env.REDISE_TOKEN_HEADRT_KEY

class Server extends BaseServer {

	/**
	 * 登录
	 * @param ctx 环境上下文
	 * @returns {Promise<{icon: (icon|{default, type}|string), user: (user|{default, type}), token: *}>}
	 */
	static async login (ctx) {
		// 获取账号密码
		const {user, pass} = ctx.vals
		// 解密密码
		const decPass = decryption(pass)
		// 查找账号
		let userData = await AdminMongo.findOne({
			user,
			type: 'ADMIN'
		})
		// 如果没有找到用户直接抛出错误
		if (!userData) {
			throw ErrorCode.auth.user_nonentity
		}
		// 判断用户登录错误次数
		if (userData.loginErrNum > 3) {
			throw ErrorCode.auth.login_max
		}
		const passMD5 = YBTool.MD5(decPass)

		// 判断账号密码是否正确
		if (passMD5 != userData.pass) {
			// 记录登录错误加1
			await AdminMongo.addLoginErrNum(userData, true)
			throw ErrorCode.auth.login_err
		}
		// 清除登录错误
		AdminMongo.clearLoginErrNum(userData)
		// ==== 用户通过验证 =====
		// 设置令牌
		const token = getToken(userData._id)
		// 将token存到redise里面
		WRedise.setString(`${REDISE_TOKEN_HEADRT_KEY}${userData._id}`, token)
		// 返回的数据
		const resData = {
			user: userData.user,
			icon: userData.icon
		}
		return {
      token,
      ...resData
		}
	}
	/**
	 * 退出登录
	 * @param ctx 环境上下文
	 * @returns {Promise<void>}
	 */
	static async logOut (ctx) {
		const token = ctx.request.header.token
		if (token) {
			const userId = await getData(token)
			WRedise.setString(`${REDISE_TOKEN_HEADRT_KEY}${userId}`, '')
		}
	}

	/**
	 * 获取用户信息
	 * @param ctx 环境上下文
	 * @returns {*}
	 */
	static getUserInfo (ctx) {
		return AdminMongo.findOne(ctx.userId)
	}

	/**
	 * 添加用户
	 * @param ctx 环境上下文
	 * @returns {Promise<void>}
	 */
  static async addUser (ctx) {
    ctx.vals.pass = YBTool.MD5(ctx.vals.pass)
    const data = await AdminMongo.addUser(ctx.vals)
		return data
  }

	/**
	 * 修改数据
	 * @param ctx 环境上下文
	 * @returns {Promise<void>}
	 */
	static async modify (ctx) {
		return await AdminMongo.updateAdmin(ctx.vals, ctx.userId)
	}
}

module.exports = Server
